package Packaging_Basic_types_BigDecimal;/*
 *
 * @author 陈粒
 * @version 创建时间：2021/7/13 10:12
 */

import org.junit.Test;

/**
 * 注意：基本类型比包装类效率高，因为基本类型只存值
 * 包装类，就是能够直接将基本类型的变量表示为一个类
 * 基本类型与其包装类都可以通过包装类中的静态或者成员方法进行转换。
 * 数字包装类的抽象父类为Number：Byte Short Integer Long Float Double
 * 其它类型包装类抽象父类为Object：Character  Boolean
 * 注意：所有的包装类都是final修饰的，也就是它们都是无法被继承和重写的
 * 基本数据类型：byte short int     long float double char       boolean
 * 包装类：     Byte Short Integer Long Float Double Character  Boolean
 * 用途：
 * 1.集合(不是数组)不允许存放基本数据类型，故常用包装类
 * 2.包含了每种基本类型的相关属性，如最大值，最小值，所占位数等
 * 3.作为基本数据类型对应的类类型，提供了一系列实用的对象操作，如类型转换，进制转换等
 * 装箱：基本数据类型到包装类型
 * 拆箱：包装类型到基本数据类型
 * 注意：设置两个装箱语句，如果两个装箱的值在-128到127之间(包括)，则两个包装对象的地址相同，使用==对比返回true
 *      只限Integer类型，Double、Float、Boolean类型都不可以，这种语句高效
 * 如：Integer a1=127；
 * Integer a2=127；
 * System.out.println(a1==a2)返回true
 */
public class Packaging {
    static Integer e;

    public static void main(String[] args) {
        Integer a = null;//包装类型
        int b = new Integer(1);//基本类型
        String s="4546";
        System.out.println(a);
        System.out.println(b);
        Character d1 = Character.valueOf('d');//基本类型转包装类型，装箱第一种方式
        Character d2 = new Character('d');//基本类型转包装类型，装箱第二种方式
        Character d3 = 'd';//基本类型转包装类型，自动装箱
        int i=Integer.parseInt("4");//拆箱
        char d5 = d3;//包装类型转基本类型，自动拆箱
        System.out.println(e);//结果null，所有引用类型变量的初始值为null
    }

    @Test
    public void testpackaging() {
        int i = 128;
        Integer i2 = 128;
        Integer i3 = new Integer(128);
        System.out.println(i == i2); //Integer会自动拆箱为int，所以为true
        System.out.println(i == i3); //true，理由同上
        Integer i4 = 127;//编译时被翻译成：Integer i4 = Integer.valueOf(127);
        Integer i5 = 127;
        System.out.println(i4 == i5);//true
        Integer i6 = 128;
        Integer i7 = 128;
        System.out.println(i6 == i7);//false
        Integer i8 = new Integer(127);
        System.out.println(i5 == i8); //false
        Integer i9 = new Integer(128);
        Integer i10 = new Integer(123);
        System.out.println(i9 == i10);  //false
    }

    @Test
    public void Arithmetictest() {
        Integer i1 = null;
        Double i2 = null;
        System.out.println(i1.parseInt("500") + 10);//Integer类型对象i1转int类型
        System.out.println(i2.parseDouble("3.56") + 1);//Double类型对象i2转double类型，计算会有浮点数不精确的问题
    }
    /*
    以上的情况总结如下：
1，无论如何，Integer与new Integer不会相等。不会经历拆箱过程，new出来的对象存放在堆，而非new的Integer常量则在常量池（在方法区），他们的内存地址不一样，所以为false。

2，两个都是非new出来的Integer，如果数在-128到127之间，则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成：Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。

3，两个都是new出来的,都为false。还是内存地址不一样。

4，int和Integer(无论new否)比，都为true，因为会把Integer自动拆箱为int再去比。
     */
}

